﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Configuration;
using ChampionRecomendedItems.Mappers;
using System.Xml;

namespace ChampionRecomendedItems.UI
{
    public partial class ConfiguracaoItemsChampion : Form
    {
        #region Atributos

        private const string BUILD = "Build ";
        private List<Item> _listaItem = null;
        private List<Item> _listaItemsCompleto = null;
        private List<CheckBox> _listaCheckDefault = null;
        private const string caminhoSemChampion = @"RADS\solutions\lol_game_client_sln\releases\0.0.0.73\deploy\DATA\Characters\";

        string _pathCompleto = string.Empty;

        public List<Item> ListaItem
        {
            set { _listaItem = value; }
        }

        #endregion

        #region Construtor

        public ConfiguracaoItemsChampion(string nomeChampion, string pathDefault)
        {
            DataSet a = new DataSet();
            InitializeComponent();
            this.lblNomeChampion.Text = nomeChampion;
            _listaItem = new List<Item>();
            string caminhoInicial = pathDefault;
            string champion = this.lblNomeChampion.Text;
            _pathCompleto = caminhoInicial + caminhoSemChampion + champion + @"\";
            _listaItemsCompleto = new List<Item>();
            _listaCheckDefault = new List<CheckBox>();
        }

        #endregion

        #region Metodos

        private void VerificarExistenciaPastaChampion()
        {

            try
            {
                bool existeDir = Directory.Exists(_pathCompleto);
                if (existeDir == false)
                {
                    if (MessageBox.Show("Diretório do champion não existe deseja cria-lo ?", "Atenção", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        Directory.CreateDirectory(_pathCompleto);
                    }
                    else
                    {
                        Application.Exit();
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void CriarTabNovo()
        {
            CriarTabNovo(null);
        }

        private void CriarTabNovo(DataTable dtSource)
        {
            TabPage novaTab = null;
            if (dtSource != null)
                novaTab = new TabPage(dtSource.TableName);
            else
                novaTab = new TabPage(BUILD + this.tabBuilds.TabPages.Count.ToString());
            CheckBox chkDefault = new CheckBox();
            CheckBox chkRenomear = new CheckBox();
            Button btnRemove = new Button();
            Button btnRenomeia = new Button();
            TextBox txtRenomeia = new TextBox();
            ListBox lstItemsRecomendados = new ListBox();

            chkRenomear.Location = new Point(130, 7);
            chkRenomear.Text = "Renomear";
            chkRenomear.CheckStateChanged += new EventHandler(chkRenomear_CheckStateChanged);

            txtRenomeia.Size = new Size(100, 20);
            txtRenomeia.Location = new Point(7, 31);
            txtRenomeia.Name = "txtRenomeia";
            txtRenomeia.Visible = false;

            btnRenomeia.Location = new Point(111, 29);
            btnRenomeia.Size = new Size(75, 23);
            btnRenomeia.Text = "Renomear";
            btnRenomeia.Name = "btnRenomeia";
            btnRenomeia.Click += new EventHandler(btnRenomeia_Click);
            btnRenomeia.Visible = false;

            lstItemsRecomendados.Name = "lstItems";
            lstItemsRecomendados.Size = new Size(333, 160);
            lstItemsRecomendados.Location = new Point(6, 57);
            lstItemsRecomendados.DisplayMember = "Nome";
            lstItemsRecomendados.ValueMember = "Id";
            if (dtSource != null)
            {
                lstItemsRecomendados.DataSource = dtSource;
            }

            btnRemove.Text = "X";
            btnRemove.Size = new Size(23, 23);
            btnRemove.Location = new Point(316, 6);
            btnRemove.Click += new EventHandler(btnRemoveBuild_Click);

            chkDefault.Text = "Default";
            chkDefault.Location = new Point(7, 7);
            chkDefault.CheckedChanged += new EventHandler(chkDefault_CheckedChanged);
            _listaCheckDefault.Add(chkDefault);

            if (this.tabBuilds.TabPages.Count < 1)
                chkDefault.Checked = true;

            this.tabBuilds.TabPages.Add(novaTab);

            novaTab.Controls.Add(chkDefault);
            novaTab.Controls.Add(btnRemove);
            novaTab.Controls.Add(lstItemsRecomendados);
            novaTab.Controls.Add(txtRenomeia);
            novaTab.Controls.Add(btnRenomeia);
            novaTab.Controls.Add(chkRenomear);
        }

        void chkDefault_CheckedChanged(object sender, EventArgs e)
        {
            if (this.tabBuilds.SelectedIndex != -1)
            {
                if (((CheckBox)sender).Checked == true)
                {
                    int contaDefault = 0;
                    foreach (CheckBox ck in this._listaCheckDefault)
                    {
                        if (ck.Checked == true)
                        {
                            contaDefault++;
                        }
                        if (contaDefault > 1)
                        {
                            MessageBox.Show("Já existe uma Build Default favor deselecionar!", "Atenção!");
                            ((CheckBox)sender).Checked = false;
                            return;
                        }
                    }
                    TabPage tabAtual = this.tabBuilds.SelectedTab;
                    this.tabBuilds.TabPages.RemoveAt(this.tabBuilds.SelectedIndex);
                    this.tabBuilds.TabPages.Insert(0, tabAtual);
                    this.tabBuilds.SelectedIndex = 0;
                }
            }
        }

        void chkRenomear_CheckStateChanged(object sender, EventArgs e)
        {
            CheckBox controle = (CheckBox)sender;

            ((TextBox)this.tabBuilds.SelectedTab.Controls["txtRenomeia"]).Visible = controle.Checked;
            ((TextBox)this.tabBuilds.SelectedTab.Controls["txtRenomeia"]).Text = string.Empty;
            ((Button)this.tabBuilds.SelectedTab.Controls["btnRenomeia"]).Visible = controle.Checked;

        }

        void btnRenomeia_Click(object sender, EventArgs e)
        {
            TextBox txt = (TextBox)this.tabBuilds.SelectedTab.Controls["txtRenomeia"];

            this.tabBuilds.SelectedTab.Text = txt.Text;
        }

        private void RemoverBuild()
        {
            DialogResult resultado = MessageBox.Show("Você realmente deseja remover essa Build ?", "Atenção", MessageBoxButtons.YesNo);

            if (resultado == DialogResult.Yes)
                this.tabBuilds.TabPages.RemoveAt(this.tabBuilds.SelectedIndex);
        }

        private DataTable ListaItemToDataTable(List<Item> lista)
        {
            DataTable retorno = new DataTable();
            DataRow linha = null;

            retorno.Columns.Add("Id");
            retorno.Columns.Add("Nome");

            foreach (Item objItem in lista)
            {
                linha = retorno.NewRow();
                linha["Id"] = objItem.Id;
                linha["Nome"] = objItem.Nome;
                retorno.Rows.Add(linha);
            }

            return retorno;
        }

        #endregion

        #region Eventos

        private void ConfiguracaoItemsChampion_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

        private void btnNovaBuild_Click(object sender, EventArgs e)
        {
            this.CriarTabNovo();
            this.VerificarSelecao();
        }

        private void btnRemoveBuild_Click(object sender, EventArgs e)
        {
            this.RemoverBuild();
            this.VerificarSelecao();
        }

        private void ConfiguracaoItemsChampion_Load(object sender, EventArgs e)
        {
            this.VerificarExistenciaPastaChampion();
            this.VerificarSelecao();
            this.CarregarListaItems();
            this.CarregarItemsArquivo(true);
        }

        private void btnSelecionarItem_Click(object sender, EventArgs e)
        {
            EscolhaItems formEscolha = new EscolhaItems();
            DialogResult resu = formEscolha.ShowDialog(this);

            if (resu == DialogResult.OK)
            {
                foreach (Control con in tabBuilds.SelectedTab.Controls)
                {
                    if (con.GetType().Equals(new ListBox().GetType()))
                        ((ListBox)con).DataSource = this.ListaItemToDataTable(this._listaItem);
                }
                this.VerificarSelecao();
            }
        }

        #endregion

        private void VerificarSelecao()
        {
            if (this.tabBuilds.TabCount == 0)
            {
                this.btnSelecionarItem.Enabled = false;
                this.btnNovaBuild.Enabled = true;
            }
            else
            {
                foreach (TabPage t in this.tabBuilds.TabPages)
                {
                    foreach (Control c in t.Controls)
                    {
                        if (c.GetType().Equals(new ListBox().GetType()))
                        {
                            if (((ListBox)c).Items.Count == 0)
                            {
                                this.btnNovaBuild.Enabled = false;
                                this.btnSelecionarItem.Enabled = true;
                            }
                            else
                                this.btnNovaBuild.Enabled = true;
                        }
                    }
                }
            }

        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            string nomeArquivo = string.Empty;
            StreamWriter write = null;
            string itemSet = "[ItemSet{0}]";
            string setName = "SetName={0}";
            string recItems = "RecItem{0}={1}";
            try
            {
                if (this.rdbSummonerRift.Checked)
                    nomeArquivo = "RecItemsCLASSIC.ini";
                else
                    nomeArquivo = "RecItemsODIN.ini";

                if (File.Exists(_pathCompleto + nomeArquivo))
                {
                    DialogResult resultado = MessageBox.Show("O arquivo já existe deseja sobrescreve-lo ?", "Atenção!", MessageBoxButtons.YesNo);
                    if (resultado == DialogResult.No)
                        return;
                }
                write = new StreamWriter(_pathCompleto + nomeArquivo);
                ListBox lista = null;
                for (int i = 0; i < this.tabBuilds.TabPages.Count; i++)
                {
                    lista = (ListBox)this.tabBuilds.TabPages[i].Controls["lstItems"];
                    write.WriteLine(itemSet, (i + 1).ToString());
                    write.WriteLine(setName, this.tabBuilds.TabPages[i].Text);

                    for (int j = 0; j < lista.Items.Count; j++)
                    {
                        write.WriteLine(recItems, (j + 1), ((DataRowView)lista.Items[j]).Row.ItemArray[0]);
                    }
                }
                MessageBox.Show("Arquivo Criado com sucesso!", "Atenção");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Atenção");
            }
            finally
            {
                if (write != null)
                    write.Close();
            }
        }

        private List<Item> CarregarListaItems()
        {
            XmlDocument documentoXml = new XmlDocument();
            documentoXml.Load(@"C:\ExemplosConsole\CustomizacaoChamp\items.xml");
            List<Item> listaItems = new List<Item>();
            Item objItem = new Item();
            int quantidadeNos = documentoXml.ChildNodes.Item(1).ChildNodes.Count;
            for (int i = 0; i < quantidadeNos; i++)
            {
                objItem = new Item();
                objItem.Id = Convert.ToInt32(documentoXml.ChildNodes.Item(1).ChildNodes.Item(i).ChildNodes.Item(0).InnerText);
                objItem.Nome = documentoXml.ChildNodes.Item(1).ChildNodes.Item(i).ChildNodes.Item(1).InnerText;
                listaItems.Add(objItem);
            }
            this._listaItemsCompleto = listaItems;
            return listaItems;
        }

        private void CarregarItemsArquivo(bool summonerRift)
        {
            StreamReader leitura = null;
            string nomeArquivo = string.Empty;
            Item objItem = null;
            DataTable dt = null;
            try
            {
                if (summonerRift)
                    nomeArquivo = "RecItemsCLASSIC.ini";
                else
                    nomeArquivo = "RecItemsODIN.ini";
                if (File.Exists(this._pathCompleto + nomeArquivo))
                {
                    leitura = new StreamReader(this._pathCompleto + nomeArquivo);
                    string leu = leitura.ReadLine();
                    while (leitura.EndOfStream == false)
                    {
                        dt = new DataTable();
                        _listaItem = new List<Item>();
                        if (leu != string.Empty)
                        {
                            if (leu.Contains("ItemSet"))
                            {
                                leu = leitura.ReadLine();
                                if (leu != string.Empty)
                                {
                                    if (leu.Contains("SetName"))
                                    {
                                        string nomeTab = leu.Trim().Replace("SetName=", string.Empty);
                                        leu = leitura.ReadLine();
                                        if (leu != string.Empty)
                                        {
                                            for (int i = 1; i < 7; i++)
                                            {
                                                objItem = new Item();
                                                objItem.Id = Convert.ToInt32(leu.Trim().Replace("RecItem" + i.ToString() + "=", string.Empty));
                                                leu = leitura.ReadLine();
                                                this._listaItem.Add(objItem);
                                            }
                                            var query = (from i in this._listaItemsCompleto
                                                         from i1 in this._listaItem
                                                         where i.Id == i1.Id
                                                         select i).ToList();
                                            dt = this.ListaItemToDataTable(query);
                                            dt.TableName = nomeTab;
                                            this.CriarTabNovo(dt);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (leitura != null)
                    leitura.Close();
            }
        }
    }
}
